package stack.easy;


import java.util.ArrayDeque;
import java.util.Deque;

/**
 * 1. 问题描述
 *      每当用户执行变更文件夹操作时，LeetCode 文件系统都会保存一条日志记录。
 * 下面给出对变更操作的说明：
 * "../" ：移动到当前文件夹的父文件夹。如果已经在主文件夹下，则 继续停留在当前文件夹 。
 * "./" ：继续停留在当前文件夹。
 * "x/" ：移动到名为 x 的子文件夹中。题目数据 保证总是存在文件夹 x 。
 * 给你一个字符串列表 logs ，其中 logs[i] 是用户在 ith 步执行的操作。
 * 文件系统启动时位于主文件夹，然后执行 logs 中的操作。
 * 执行完所有变更文件夹操作后，请你找出 返回主文件夹所需的最小步数 。
 *
 * 2. 算法分析
 *      非常典型的栈结构问题
 *
 * 3. 代码实现
 */
@SuppressWarnings("all")
public class 文件夹操作日志搜集器 {
    public static void main(String[] args) {

    }

    public int minOperations1(String[] logs) {
        Deque<String> stack = new ArrayDeque<>(); // 定义栈
        int count = 0; // 记录次数
        for(String log : logs) {
            if("../".equals(log)) {
                // 如果当前操作为 ../ 退回到上一级，此时我们需要判断当前是否已经在主文件夹下了
                if(stack.isEmpty()){
                    // 如果栈为空，说明此时栈在主目录中不需要移动
                    continue;
                }
                // 否则回退到上一级
                count--;
                stack.pop();
            }
            else if("./".equals(log)) {
                // 当前操作为 ./ 继续停留在当前文件 即count不变
                continue;
            }
            else {
                count++;
                stack.push(log); // 当前子文件夹入栈
            }
        }
        return count;
    }

    /**
     * 优化：不使用栈实现
     * @param logs
     * @return
     */
    public int minOperations2(String[] logs) {
        int count = 0; // 记录访问的子文件层级数，当层级为0时说明当前在主目录上，由此我们可以不需要使用栈就可以实现
        for(String log : logs) {
            if("./".equals(log)) {continue;}
            else if("../".equals(log)) {
                if(count == 0) { //  这一步相当于上述判断当前栈是否为空，
                    continue;
                }
                count--;
            }else {count++;}
        }
        return count;
    }
}
